import pickle

def pickle_file_operations(data_to_save, save_file_path, load_file_path=None):
    """
    使用 pickle 模块保存 Python 对象到文件，并可选择从文件加载对象。

    Args:
        data_to_save: 要保存的 Python 对象 (例如，列表、字典、DataFrame 等)。
                       如果 load_file_path 参数被提供，则此参数可以为 None。
        save_file_path:  要保存对象的文件路径 (例如， "my_data.pkl")。
        load_file_path: (可选) 要加载对象的文件路径。
                        如果提供此参数，函数将尝试从该文件加载对象并返回。
                        如果为 None，则函数仅执行保存操作。

    return:
        如果 load_file_path 被提供，且加载成功，则返回加载的 Python 对象。
        否则，返回 None。
    """

    loaded_data = None  # 初始化加载的数据为 None

    # 保存对象到 pickle 文件
    if data_to_save is not None and save_file_path: # 只有当data_to_save 和 save_file_path 都提供时才保存
        try:
            with open(save_file_path, 'wb') as file:
                pickle.dump(data_to_save, file)
            print(f"对象已成功保存到 pickle 文件: {save_file_path}")
        except Exception as e:
            print(f"保存 pickle 文件时出错: {e}")
            print(f"错误信息: {e}")
            return None # 保存失败，返回 None

    # 从 pickle 文件加载对象 (如果提供了 load_file_path)
    if load_file_path:
        try:
            with open(load_file_path, 'rb') as file:
                loaded_data = pickle.load(file)
            print(f"已从 pickle 文件加载对象: {load_file_path}")
            return loaded_data # 加载成功，返回加载的数据
        except FileNotFoundError:
            print(f"错误: 文件未找到: {load_file_path}")
        except Exception as e:
            print(f"加载 pickle 文件时出错: {e}")
            print(f"错误信息: {e}")
        return None # 加载失败 (文件未找到或其他错误)，返回 None
    else:
        return None # 只执行了保存操作，没有加载，返回 None



if __name__ == "__main__":
    # 示例用法：
    # 1. 保存数据
    data_to_be_saved = {"name": "示例数据", "values": [10, 20, 30]}
    save_path = "example_data.pkl"
    pickle_file_operations(data_to_be_saved, save_path) # 保存数据到 example_data.pkl

    # 2. 加载数据
    load_path = "example_data.pkl"
    loaded_data = pickle_file_operations(None, None, load_path) # 从 example_data.pkl 加载数据

    if loaded_data: # 检查是否成功加载数据
        print("\n加载的数据内容:")
        print(loaded_data)


    # 3.  尝试加载不存在的文件 (演示错误处理)
    load_path_not_exist = "non_existent_file.pkl"
    loaded_data_fail = pickle_file_operations(None, None, load_path_not_exist)

    if loaded_data_fail is None:
        print("\n加载文件失败，返回值为 None。")